#/bin/bash

directorio=`readlink -f "${BASH_SOURCE[0]}"`
directorio=${directorio%'/'*}'/'

GRUPO="$HOME/grupo06"
CONFDIR="$GRUPO/confdir"
echo "Comando InstalaW5 Inicio de Ejecucion"
BINDIR="$GRUPO/bin"
MAEDIR="$GRUPO/mae"
ARRIDIR="$GRUPO/arribos"
DATASIZE="100"
ACEPDIR="$GRUPO/aceptados"
RECHDIR="$GRUPO/rechazados"
PROCDIR="$GRUPO/procesados"
LOGSIZE="400"
REPODIR="$GRUPO/reportes"

mkdir -p $GRUPO
export LOGDIR=`readlink -f .`
LOGDIR="$GRUPO/log"
LOGEXT="log"
export CONFDIR
export LOGSIZE
export LOGEXT # para poder usar el logger

LOGGER_EXE="perl ./BINDIR/LoguearW5.pl"

function setVariable()
{
	variable="$1"
	valor="$2"
	sed "/^$variable/d" -i $configFile
	echo "$variable=$valor" >> $configFile
}

function setDirectorio()
{
	variable="$1"
	valor=`echo "$2" | sed 's@[^/]$@&/@'` # Agregar barra al final
	setVariable $variable $valor
}

function generarConfiguracion()
{
	echo -n > $configFile
	setDirectorio GRUPO $GRUPO
	setDirectorio CONFDIR $CONFDIR
	setDirectorio BINDIR $BINDIR
	setDirectorio MAEDIR $MAEDIR
	setDirectorio ARRIDIR $ARRIDIR
	setDirectorio RECHDIR $RECHDIR
	setDirectorio ACEPDIR $ACEPDIR
	setDirectorio PROCDIR $PROCDIR
	setDirectorio REPODIR $REPODIR
	setDirectorio LOGDIR $LOGDIR
	setVariable DATASIZE `expr $DATASIZE '*' 1024 '*' 1024`
	setVariable LOGSIZE `expr $LOGSIZE '*' 1024`
	setVariable LOGEXT $LOGEXT
	setVariable SECUENCIA1 0
	setVariable SECUENCIA2 0
}

function mostrarDirectorio()
{
	local formato='s/^.*$/\t&/'
	ls -1 $1 | sed $formato
}

function verificarDirectorio()
{
	local directorio="$1"
	local lista="$2"
	local faltante=
	local cantidad=0
	for archivo in $lista; do
		if [ ! -e "$directorio$archivo" ]; then
			faltante=$faltante" $archivo"
			cantidad=`expr $cantidad + 1`
		fi
	done
	echo -e "\tComponentes existentes:"
	ls -1 $directorio | sed 's/^.*$/\t\t&/'
	echo -e "\tComponentes faltantes: $cantidad"
	for archivo in $faltante; do
		echo -e "\t\t$archivo"
		$LOGGER_EXE -a -m="Archivo $archivo faltante." -l="InstalaW5.sh" > /dev/null
	done
	return $cantidad
}

function detectarInstalacion()
{
	if [ -r "$CONFDIR/InstalaW5.conf" ]; then
		. "$directorio"'BINDIR/leerConfig.sh' "$CONFDIR/InstalaW5.conf"
		echo "Se detectó una instalacion existente"
		$LOGGER_EXE -a -m="Se detecto una instalacion ya existente." -l="InstalaW5.sh" > /dev/null
		local faltantes=0
		verificarDirectorio $BINDIR "$LISTA_BINDIR"
		faltantes=`expr $faltantes + $?`
		verificarDirectorio $MAEDIR "$LISTA_MAEDIR"
		faltantes=`expr $faltantes + $?`
		return $faltantes
	fi
	return 100
}

function mostrarConfiguracionCompleta()
{
	echo 'TP SO7508 Segundo Cuatrimestre 2012. Tema W Copyright © Grupo 06'
	$LOGGER_EXE -i -m="TP SO7508 Segundo Cuatrimestre 2012. Tema W Copyright © Grupo 06." -l="InstalaW5.sh" > /dev/null
	echo 'Libreria del sistema: '$CONFDIR
	$LOGGER_EXE -i -m="Libreria del sistema: $CONFDIR." -l="InstalaW5.sh" > /dev/null
	mostrarDirectorio $CONFDIR
	echo 'Ejecutables: '$BINDIR
	$LOGGER_EXE -i -m="Ejecutables: $BINDIR." -l="InstalaW5.sh" > /dev/null
	mostrarDirectorio $BINDIR
	echo 'Archivos maestros: '$MAEDIR
	$LOGGER_EXE -i -m="Archivos maestros: $MAEDIR." -l="InstalaW5.sh" > /dev/null
	mostrarDirectorio $MAEDIR
	echo 'Directorio de arribo de archivos externos: '$ARRIDIR
	$LOGGER_EXE -i -m="Directorio de arribo de archivos externos: $ARRIDIR." -l="InstalaW5.sh" > /dev/null
	echo 'Archivos externos aceptados: '$ACEPDIR
	$LOGGER_EXE -i -m="Archivos externos aceptados: $ACEPDIR." -l="InstalaW5.sh" > /dev/null
	echo 'Archivos externos rechazados: '$RECHDIR
	$LOGGER_EXE -i -m="Archivos externos rechazados: $RECHDIR." -l="InstalaW5.sh" > /dev/null
	echo 'Archivos procesados: '$PROCDIR
	$LOGGER_EXE -i -m="Archivos procesados: $PROCDIR." -l="InstalaW5.sh" > /dev/null
	echo 'Reportes de salida: '$REPODIR
	$LOGGER_EXE -i -m="Reportes de salida: $REPODIR." -l="InstalaW5.sh" > /dev/null
	echo 'Logs de auditoria del Sistema: '"$LOGDIR<comando>.$LOGEXT"
	$LOGGER_EXE -i -m="Logs de auditoria del sistema: $LOGDIR<comando>.$LOGEXT." -l="InstalaW5.sh" > /dev/null
	echo 'Estado de la instalacion: COMPLETA'
	$LOGGER_EXE -a -m="Estado de la instalacion: COMPLETA." -l="InstalaW5.sh" > /dev/null
	echo 'Proceso de Instalación Cancelado'
	$LOGGER_EXE -a -m="Proceso de instalacion cancelado." -l="InstalaW5.sh" > /dev/null

	return 0
}

function completarInstalacion()
{
	configFile="$directorio"'InstalaW5.conf.temp'
	generarConfiguracion
	"$directorio"InstalaW5-build.sh
	exit 0
}

function mostrarConfiguracionIncompleta()
{
	echo "Ejecutables: $BINDIR"
	$LOGGER_EXE -i -m="Ejecutables: $BINDIR." -l="InstalaW5.sh" > /dev/null
	verificarDirectorio $BINDIR "$LISTA_BINDIR" > /dev/null
	echo "Archivos maestros: $MAEDIR"
	$LOGGER_EXE -i -m="Archivos maestros: $MAEDIR." -l="InstalaW5.sh" > /dev/null
	verificarDirectorio $MAEDIR "$LISTA_MAEDIR" > /dev/null
	echo "Estado de la instalacion: INCOMPLETA"
	$LOGGER_EXE -a -m="Estado de la instalacion: INCOMPLETA." -l="InstalaW5.sh" > /dev/null
	read -p "Desea completar la instalacion? (s/n)" sn
    	case $sn in
        	[Ss]* ) $LOGGER_EXE -i -m="Se decidio completar la instalacion." -l="InstalaW5.sh" > /dev/null
			completarInstalacion;;
       		* ) exit 0;;
    	esac
	$LOGGER_EXE -i -m="Se decidio no completar la instalacion." -l="InstalaW5.sh" > /dev/null
}

detectarInstalacion
codigo=$?
if [ $codigo -ne 100 ]; then # Se detectó instalación
	if [ $codigo -eq 0 ]; then
		mostrarConfiguracionCompleta
		exit 0
	else
		mostrarConfiguracionIncompleta
	fi
fi

#Check if Perl is installed
if perl < /dev/null > /dev/null 2>&1  ; then
      echo "Checking if Perl is installed... OK."
else
      echo "TP SO7508 Segundo Cuatrimestre 2012. Tema W Copyright © Grupo 06
Para instalar el TP es necesario contar con Perl 5 o superior instalado.
Efectúe su instalación e inténtelo nuevamente.
Proceso de Instalación Cancelado"
	$LOGGER_EXE -i -m="TP SO7508 Segundo Cuatrimestre 2012. Tema W Copyright © Grupo 06." -l="InstalaW5.sh" > /dev/null
	$LOGGER_EXE -a -m="Para instalar el TP es necesario contar con Perl 5 o superior instalado. Efectúe su instalación e inténtelo nuevamente. Proceso de Instalación Cancelado." -l="InstalaW5.sh" > /dev/null
	exit 1
fi

echo "Directorio de Trabajo para la instalacion: $GRUPO"
$LOGGER_EXE -i -m="Directorio de Trabajo para la instalacion: $GRUPO" -l="InstalaW5.sh" > /dev/null

echo "Librería del Sistema: $CONFDIR"
$LOGGER_EXE -i -m="Libreria del Sistema: $CONFDIR" -l="InstalaW5.sh" > /dev/null

$LOGGER_EXE -a -m="Estado de la instalacion: PENDIENTE" -l="InstalaW5.sh" > /dev/null
$LOGGER_EXE -a -m="Directorio de instalacion de ejecutables a definir." -l="InstalaW5.sh" > /dev/null
$LOGGER_EXE -a -m="Directorio de instalacion de archivos maestros a definir." -l="InstalaW5.sh" > /dev/null
$LOGGER_EXE -a -m="Directorio de instalacion de arribo de archivos externos a definir." -l="InstalaW5.sh" > /dev/null
$LOGGER_EXE -a -m="Directorio de instalacion de grabacion de archivos externos rechazados a definir." -l="InstalaW5.sh" > /dev/null
$LOGGER_EXE -a -m="Directorio de instalacion de grabacion de archivos externos aprobados a definir." -l="InstalaW5.sh" > /dev/null
$LOGGER_EXE -a -m="Directorio de instalacion de grabacion de los reportes de salida a definir." -l="InstalaW5.sh" > /dev/null
$LOGGER_EXE -a -m="Espacio minimo libre para arribo de archivos externos a definir." -l="InstalaW5.sh" > /dev/null
echo "Estado de la instalacion: PENDIENTE
Para completar la instalación Ud. Deberá:
Definir el directorio de instalación de los ejecutables
Definir el directorio de instalación de los archivos maestros
Definir el directorio de arribo de archivos externos
Definir el espacio mínimo libre para el arribo de archivos externos
Definir el directorio de grabación de los archivos externos rechazados
Definir el directorio de grabacion de los archivos externos aceptados
Definir el directorio de grabación de los logs de auditoria
Definir la extensión y tamaño máximo para los archivos de log
Definir el directorio de grabación de los reportes de salida"

while true; do
	read -ep "Defina el directorio de instalación de los ejecutables ($BINDIR):" auxV
	if [ ! -z $auxV ]; then
		BINDIR=`readlink -m $auxV`
	fi
	read -ep "Defina el directorio de instalación de los archivos maestros ($MAEDIR):" auxV
	if [ ! -z $auxV ]; then
		MAEDIR=`readlink -m $auxV`
	fi
	read -ep "Defina el directorio de arribo de los archivos externos ($ARRIDIR):" auxV
	if [ ! -z $auxV ]; then
		ARRIDIR=`readlink -m $auxV`
	fi
	read -ep "Defina el espacio mínimo libre para el arribo de archivos externos en Mbytes ($DATASIZE):" auxV
	if [ ! -z $auxV ]; then
		DATASIZE=$auxV
		espacio=`df -m | sed -n 2,2p | awk '{print $4}'`
		while [ $DATASIZE -gt $espacio ]; do
			echo "Espacio en disco disponible insuficiente ($espacio M)"
			read -ep "Defina el espacio mínimo libre para el arribo de archivos externos en Mbytes:" DATASIZE
		done
	fi

	read -ep "Defina el directorio de grabacion de los archivos externos rechazados ($RECHDIR):" auxV
	if [ ! -z $auxV ]; then
		RECHDIR=`readlink -m $auxV`
	fi
	read -ep "Defina el directorio de grabacion de los archivos externos aceptados ($ACEPDIR):" auxV
	if [ ! -z $auxV ]; then
		ACEPDIR=`readlink -m $auxV`
	fi
	read -ep "Defina el directorio de grabacion de los archivos externos procesados ($PROCDIR):" auxV
	if [ ! -z $auxV ]; then
		PROCDIR=`readlink -m $auxV`
	fi

	echo "Los Logs de este sistema se grabaran en: $GRUPO/log"
	#LOGDIR="$GRUPO/log", iniciados arriba

	read -ep "Defina la extensión de los archivos de log ($LOGEXT):" auxV
	if [ ! -z $auxV ]; then
		export LOGEXT=$auxV
	fi

	read -ep "Defina el tamaño máximo para los archivos .$LOGEXT en Kbytes ($LOGSIZE):" auxV
	if [ ! -z $auxV ]; then
		export LOGSIZE=$auxV
	fi
	read -ep "Defina el directorio de grabacion de los reportes de salida ($REPODIR):" auxV
	if [ ! -z $auxV ]; then
		REPODIR=`readlink -m $auxV`
	fi

	echo "TP SO7508 1mer cuatrimestre 2012. Tema x Copyright © Grupo xx
Librería del Sistema: $CONFDIR
Ejecutables: $BINDIR
Archivos maestros: $MAEDIR
Directorio de arribo de archivos externos: $ARRIDIR
Espacio mínimo libre para arribos: $DATASIZE Mb
Archivos externos aceptados: $ACEPDIR
Archivos externos rechazados: $RECHDIR
Archivos procesados: $PROCDIR
Reportes de salida: $REPODIR
Logs de auditoria del Sistema: $LOGDIR/<comando>.$LOGEXT
Tamaño máximo para los archivos de log del sistema: $LOGSIZE Kb
Estado de la instalacion: LISTA"

    read -p "Los datos ingresados son correctos? (s/n)" sn
    case $sn in
        [Ss]* ) break;;
        * ) clear; continue;;
    esac
done

configFile="$directorio"'InstalaW5.conf.temp'
generarConfiguracion
chmod +x "${directorio}InstalaW5-build.sh"
"$directorio"InstalaW5-build.sh

mkdir "$LOGDIR"
mv "$GRUPO/logInstalaW5.sh.log" "$LOGDIR/"
exit 0

